package util.Persistencia;

import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import util.Util;

public abstract class DAOJPA implements IDAOJPA {
    //Obtém o factory a partir da unidade de persistência.

    protected static final EntityManagerFactory emf =
            Persistence.createEntityManagerFactory("JPA");
    protected static EntityManager em = emf.createEntityManager();

    @Override
    public Object Salvar(Object objeto) {
        // Inicia uma transação com o banco de dados.
        em.getTransaction().begin();
        //Salva os dados do objeto.
        em.persist(objeto);
        // Finaliza a transação.
        em.getTransaction().commit();
        return objeto;
    }

    @Override
    public void Excluir(Object objeto) throws Exception {
        // Inicia uma transação com o banco de dados.
        try {
            em.getTransaction().begin();
            //remove a pessoa do banco.
            em.remove(objeto);
            // Finaliza a transação.
            em.getTransaction().commit();
        } catch (Exception e) {
            if (em.getTransaction().isActive()) {
                em.getTransaction().rollback();
            }
            throw e;
        }
    }

    @Override
    public void Alterar(Object objeto) {
        // Inicia uma transação com o banco de dados.
        em.getTransaction().begin();
        //Salva os dados da Pessoa.
        em.merge(objeto);
        // Finaliza a transação.
        em.getTransaction().commit();
        //Fecha o factory para liberar os recursos utilizado.
    }

    @Override
    public List Listar(Class classe) {
        try {
            Query query = em.createQuery("Select a from " + classe.getSimpleName() + " a");
            System.out.println(query.toString());
            return query.getResultList();
        } catch (Exception ex) {
            System.out.println("Erro ao listar produtos.");
            ex.printStackTrace();
            return new ArrayList();
        }
    }
}
